From b04eecf860e8f6fe2503101d6bc8112c262939d9 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Sun, 18 Dec 2016 06:54:48 +0100 Subject: [PATCH] vulkan: Pass color rects in instance data This way, we don't need push constants or per-vertex data, we can render colored rectangles completely via instance data. --- gsk/gskvulkancolorpipeline.c | 49 ++++++++++++++++----------- gsk/gskvulkancolorpipelineprivate.h | 3 +- gsk/gskvulkanrenderpass.c | 3 +- gsk/resources/vulkan/color.frag.glsl | 4 +-- gsk/resources/vulkan/color.frag.spv | Bin 804 -> 672 bytes gsk/resources/vulkan/color.vert.glsl | 16 +++++++-- gsk/resources/vulkan/color.vert.spv | Bin 948 -> 1632 bytes 7 files changed, 49 insertions(+), 26 deletions(-) diff --git a/gsk/gskvulkancolorpipeline.c b/gsk/gskvulkancolorpipeline.c index 6702537896..ab6c3e581f 100644 --- a/gsk/gskvulkancolorpipeline.c +++ b/gsk/gskvulkancolorpipeline.c @@ -7,12 +7,12 @@ struct _GskVulkanColorPipeline GObject parent_instance; }; -typedef struct _GskVulkanVertex GskVulkanVertex; +typedef struct _GskVulkanColorInstance GskVulkanColorInstance; -struct _GskVulkanVertex +struct _GskVulkanColorInstance { - float x; - float y; + float rect[4]; + float color[4]; }; G_DEFINE_TYPE (GskVulkanColorPipeline, gsk_vulkan_color_pipeline, GSK_TYPE_VULKAN_PIPELINE) @@ -23,16 +23,22 @@ gsk_vulkan_color_pipeline_get_input_state_create_info (GskVulkanPipeline *self) static const VkVertexInputBindingDescription vertexBindingDescriptions[] = { { .binding = 0, - .stride = sizeof (GskVulkanVertex), - .inputRate = VK_VERTEX_INPUT_RATE_VERTEX + .stride = sizeof (GskVulkanColorInstance), + .inputRate = VK_VERTEX_INPUT_RATE_INSTANCE } }; static const VkVertexInputAttributeDescription vertexInputAttributeDescription[] = { { .location = 0, .binding = 0, - .format = VK_FORMAT_R32G32_SFLOAT, + .format = VK_FORMAT_R32G32B32A32_SFLOAT, .offset = 0, + }, + { + .location = 1, + .binding = 0, + .format = VK_FORMAT_R32G32B32A32_SFLOAT, + .offset = G_STRUCT_OFFSET (GskVulkanColorInstance, color), } }; static const VkPipelineVertexInputStateCreateInfo info = { @@ -80,22 +86,25 @@ gsk_vulkan_color_pipeline_new (GskVulkanPipelineLayout *layout, gsize gsk_vulkan_color_pipeline_count_vertex_data (GskVulkanColorPipeline *pipeline) { - return sizeof (GskVulkanVertex) * 6; + return sizeof (GskVulkanColorInstance); } void gsk_vulkan_color_pipeline_collect_vertex_data (GskVulkanColorPipeline *pipeline, guchar *data, - const graphene_rect_t *rect) + const graphene_rect_t *rect, + const GdkRGBA *color) { - GskVulkanVertex *vertices = (GskVulkanVertex *) data; - - vertices[0] = (GskVulkanVertex) { rect->origin.x, rect->origin.y }; - vertices[1] = (GskVulkanVertex) { rect->origin.x + rect->size.width, rect->origin.y }; - vertices[2] = (GskVulkanVertex) { rect->origin.x, rect->origin.y + rect->size.height }; - vertices[3] = (GskVulkanVertex) { rect->origin.x, rect->origin.y + rect->size.height }; - vertices[4] = (GskVulkanVertex) { rect->origin.x + rect->size.width, rect->origin.y }; - vertices[5] = (GskVulkanVertex) { rect->origin.x + rect->size.width, rect->origin.y + rect->size.height }; + GskVulkanColorInstance *instance = (GskVulkanColorInstance *) data; + + instance->rect[0] = rect->origin.x; + instance->rect[1] = rect->origin.y; + instance->rect[2] = rect->size.width; + instance->rect[3] = rect->size.height; + instance->color[0] = pow (color->red, 2.2); + instance->color[1] = pow (color->green, 2.2); + instance->color[2] = pow (color->blue, 2.2); + instance->color[3] = color->alpha; } gsize @@ -105,8 +114,8 @@ gsk_vulkan_color_pipeline_draw (GskVulkanColorPipeline *pipeline, gsize n_commands) { vkCmdDraw (command_buffer, - n_commands * 6, 1, - offset, 0); + 6, n_commands, + 0, offset); - return n_commands * 6; + return n_commands; } diff --git a/gsk/gskvulkancolorpipelineprivate.h b/gsk/gskvulkancolorpipelineprivate.h index 4fbc22a44f..07e63827c8 100644 --- a/gsk/gskvulkancolorpipelineprivate.h +++ b/gsk/gskvulkancolorpipelineprivate.h @@ -20,7 +20,8 @@ GskVulkanPipeline * gsk_vulkan_color_pipeline_new (GskVulk gsize gsk_vulkan_color_pipeline_count_vertex_data (GskVulkanColorPipeline *pipeline); void gsk_vulkan_color_pipeline_collect_vertex_data (GskVulkanColorPipeline *pipeline, guchar *data, - const graphene_rect_t *rect); + const graphene_rect_t *rect, + const GdkRGBA *color); gsize gsk_vulkan_color_pipeline_draw (GskVulkanColorPipeline *pipeline, VkCommandBuffer command_buffer, gsize offset, diff --git a/gsk/gskvulkanrenderpass.c b/gsk/gskvulkanrenderpass.c index 337b6adbff..fed4e7caeb 100644 --- a/gsk/gskvulkanrenderpass.c +++ b/gsk/gskvulkanrenderpass.c @@ -333,7 +333,8 @@ gsk_vulkan_render_pass_collect_vertex_data (GskVulkanRenderPass *self, op->render.vertex_offset = offset + n_bytes; gsk_vulkan_color_pipeline_collect_vertex_data (GSK_VULKAN_COLOR_PIPELINE (op->render.pipeline), data + n_bytes + offset, - &bounds); + &bounds, + gsk_color_node_peek_color (op->render.node)); n_bytes += op->render.vertex_count; } break; diff --git a/gsk/resources/vulkan/color.frag.glsl b/gsk/resources/vulkan/color.frag.glsl index fba9e47120..cbac7ed961 100644 --- a/gsk/resources/vulkan/color.frag.glsl +++ b/gsk/resources/vulkan/color.frag.glsl @@ -1,6 +1,6 @@ #version 420 core -layout(set = 0, binding = 0) uniform sampler2D inTexture; +layout(location = 0) in vec4 inColor; layout(push_constant) uniform PushConstants { mat4 mvp; @@ -11,5 +11,5 @@ layout(location = 0) out vec4 color; void main() { - color = push.color; + color = inColor; } diff --git a/gsk/resources/vulkan/color.frag.spv b/gsk/resources/vulkan/color.frag.spv index beee876b1766f81a3300a7044cc4aefc323d0e0c..2865771377a09b53eb2b06abe5bfee8ad8e3d5af 100644 GIT binary patch literal 672 zcmYk3-Acni5QRtEw6)d#AgEWR();3tiXe(mB)te!@BunX_|tr;XET+w4TYj*aZNMs_M}*0WZTUGLMIW%+t`|8R$*Z;e8TW?*e=DifPk zlu$TR^b|ws;ANn%hPs;l=up$T=6b%nT)N)7AEc?D<==7W$59gc>u47Sd2|TTb!xgO z3F7^_E^wr%`-1Tfw()kS4CWqDGA|fM@97JF?6a@=Hp%i;l4rs#>EKzLLn`bPnD^Ct z4TV#kMdy}YV}KSIuL>_}Jst6jvM1Upn^v7;M)a>ZywSZWT+NRAF~3Xg)sD4q_=r;M1& literal 804 zcmYk3-Ae*d5XG+_Yo_H#rWS!{J_gc5MG!?1u|6yq)cYd3(1Nbwu2TO`e`GH~=eMr3 zv&@})=AOB8?rbjG-!mqouV~t4Yju+qHl}O}akQN`XAnly!PWI8jEc#{L^xG(@{0I; z><1j|%WLA0)8*RbbfYofD#)9Xu^rbQjcn(|oh+Ab7=6t=cjgD4JM~xIB=R>Nykd&y z2b0-)nkHCcqBXM8)KWS6!+Vt5nim?G8GYz| zF2{Dbw}qx57Q9|OUlR@`k!joP(&a6wC(VjlpX5;9`((HM2`MoW`x~n n#>@ll7;pMfhJW&;mELtZdeL+*COVGf6#3ld`+%ZVBG$g+IXm z;E(ji#P`|VWA<#OXXc&v%*>fHt&}?#j4A1Bm;;lo1yh!7%&e)WyVLvB>&D5byR*9u zW6o4kBAj`1G1aU3Jw5gVjHcwa@@?$7 zV?XfRkw5WEaAnOE!1I2Y!&-yg3->*)L02o4OBY=Okc= z<;+Vr=KCAV;jUnCEVhu_;1;_o9XrEj(mEDplY}HP9qg&Ejxeed;8yr41vp@{|ZSBM---k~GwER5ccAL%&5i^vKIWZS{-qfBb|vJ2LoK|~a|ts-E!2t)k2*N>Qo_68 M<2|weD&xN7AC4_;_y7O^ literal 948 zcmYk3UrPc}5XEomnq_Hb{^_3?J_gc5MGzGcu|5bIL9dJGQVY6@yGp(F75WZ+$Xxie?(jmK*1#;oZ}nW~vv&cu`(lQzj&w3{!@dJy*N7nkQSGA2GF!pRyP zmnGzbj_0%9lo#c3eKEx!5feh~ren8ScJs;Ujz&%pe)e6b@Au7&@@@JQ!QOz_^3PN=<8)Tgx7`h)<10 zUv8D2)BvM~ts3;L$g#Xo@KbSk5!OYml8RM%Nqp*%b7vLpp$DugWJ8g2U^h|D-GCL8 zGe=df=QC$fzNIx*R=%xBtwn8gf>ArGNPRGBlQRz(`?+WhADw%O=wt@=3ySmw=R7&H zgP{d(S&l98{aN;P&w1{MInZ~dd!;TqG4Nj@yu*Y3XxWvckNIxJL|0x8PL7U}91YJp zL;r&aQ&?h$5r)pTy3_wi4wpSNqw`xe*gKZf2M$`$eIn-_&~hiW